home *** CD-ROM | disk | FTP | other *** search
/ IRIX Patches 1995 June / SGI IRIX Patches 1995 Jun.iso / 5.3_patches / patchSG0000154 / patchSG0000154.idb / usr / share / src / OpenGL / samples / fog.c.z / fog.c
Encoding:
C/C++ Source or Header  |  1995-06-12  |  5.9 KB  |  272 lines

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include "tk.h"
  5.  
  6.  
  7. GLenum rgb, doubleBuffer, directRender;
  8.  
  9. double plane[4] = {
  10.     1.0, 0.0, -1.0, 0.0
  11. };
  12. float rotX = 5.0, rotY = -5.0, zTranslate = -65.0;
  13. float fogDensity = 0.02;
  14. GLint cubeList = 1;
  15.  
  16. float scp[18][3] = {
  17.     {
  18.     1.000000, 0.000000, 0.000000
  19.     },    
  20.     {
  21.     1.000000, 0.000000, 5.000000
  22.     },
  23.     {
  24.     0.707107, 0.707107, 0.000000
  25.     },    
  26.     {
  27.     0.707107, 0.707107, 5.000000
  28.     },
  29.     {
  30.     0.000000, 1.000000, 0.000000
  31.     },    
  32.     {
  33.     0.000000, 1.000000, 5.000000
  34.     },
  35.     {
  36.     -0.707107, 0.707107, 0.000000
  37.     },    
  38.     {
  39.     -0.707107, 0.707107, 5.000000
  40.     },
  41.     {
  42.     -1.000000, 0.000000, 0.000000
  43.     },    
  44.     {
  45.     -1.000000, 0.000000, 5.000000
  46.     },
  47.     {
  48.     -0.707107, -0.707107, 0.000000
  49.     },    
  50.     {
  51.     -0.707107, -0.707107, 5.000000
  52.     },
  53.     {
  54.     0.000000, -1.000000, 0.000000
  55.     },    
  56.     {
  57.     0.000000, -1.000000, 5.000000
  58.     },
  59.     {
  60.     0.707107, -0.707107, 0.000000
  61.     },    
  62.     {
  63.     0.707107, -0.707107, 5.000000
  64.     },
  65.     {
  66.     1.000000, 0.000000, 0.000000
  67.     },    
  68.     {
  69.     1.000000, 0.000000, 5.000000
  70.     },
  71. };
  72.  
  73.  
  74. static void Build_lists(void)
  75. {
  76.  
  77.     glNewList(cubeList, GL_COMPILE);
  78.     glBegin(GL_TRIANGLE_STRIP);
  79.        glNormal3fv(scp[0]); glVertex3fv(scp[0]);
  80.        glNormal3fv(scp[0]); glVertex3fv(scp[1]);
  81.        glNormal3fv(scp[2]); glVertex3fv(scp[2]);
  82.        glNormal3fv(scp[2]); glVertex3fv(scp[3]);
  83.        glNormal3fv(scp[4]); glVertex3fv(scp[4]);
  84.        glNormal3fv(scp[4]); glVertex3fv(scp[5]);
  85.        glNormal3fv(scp[6]); glVertex3fv(scp[6]);
  86.        glNormal3fv(scp[6]); glVertex3fv(scp[7]);
  87.        glNormal3fv(scp[8]); glVertex3fv(scp[8]);
  88.        glNormal3fv(scp[8]); glVertex3fv(scp[9]);
  89.        glNormal3fv(scp[10]); glVertex3fv(scp[10]);
  90.        glNormal3fv(scp[10]); glVertex3fv(scp[11]);
  91.        glNormal3fv(scp[12]); glVertex3fv(scp[12]);
  92.        glNormal3fv(scp[12]); glVertex3fv(scp[13]);
  93.        glNormal3fv(scp[14]); glVertex3fv(scp[14]);
  94.        glNormal3fv(scp[14]); glVertex3fv(scp[15]);
  95.        glNormal3fv(scp[16]); glVertex3fv(scp[16]);
  96.        glNormal3fv(scp[16]); glVertex3fv(scp[17]);
  97.     glEnd();
  98.     glEndList();
  99. }
  100.  
  101. static void Init(void)
  102. {
  103.     static float ambient[] = {0.1, 0.1, 0.1, 1.0};
  104.     static float diffuse[] = {1.0, 1.0, 1.0, 1.0};
  105.     static float position[] = {90.0, 90.0, 0.0, 0.0};
  106.     static float front_mat_shininess[] = {30.0};
  107.     static float front_mat_specular[] = {0.0, 0.0, 0.0, 1.0};
  108.     static float front_mat_diffuse[] = {0.0, 1.0, 0.0, 1.0};
  109.     static float back_mat_shininess[] = {50.0};
  110.     static float back_mat_specular[] = {0.0, 0.0, 1.0, 1.0};
  111.     static float back_mat_diffuse[] = {1.0, 0.0, 0.0, 1.0};
  112.     static float lmodel_ambient[] = {0.0, 0.0, 0.0, 1.0};
  113.     static float fog_color[] = {0.8, 0.8, 0.8, 1.0};
  114.     
  115.     glFrontFace(GL_CW);
  116.  
  117.     glEnable(GL_DEPTH_TEST);
  118.  
  119.     glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
  120.     glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
  121.     glLightfv(GL_LIGHT0, GL_POSITION, position);
  122.     glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
  123.     glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
  124.     glEnable(GL_LIGHTING);
  125.     glEnable(GL_LIGHT0);
  126.     
  127.     glMaterialfv(GL_FRONT, GL_SHININESS, front_mat_shininess);
  128.     glMaterialfv(GL_FRONT, GL_SPECULAR, front_mat_specular);
  129.     glMaterialfv(GL_FRONT, GL_DIFFUSE, front_mat_diffuse);
  130.     glMaterialfv(GL_BACK, GL_SHININESS, back_mat_shininess);
  131.     glMaterialfv(GL_BACK, GL_SPECULAR, back_mat_specular);
  132.     glMaterialfv(GL_BACK, GL_DIFFUSE, back_mat_diffuse);
  133.  
  134.     glEnable(GL_FOG);
  135.     glFogi(GL_FOG_MODE, GL_EXP);
  136.     glFogf(GL_FOG_DENSITY, fogDensity);
  137.     if (rgb) {
  138.     glFogfv(GL_FOG_COLOR, fog_color);
  139.     glClearColor(0.8, 0.8, 0.8, 1.0);
  140.     } else {
  141.     glFogi(GL_FOG_INDEX, 1<<5);
  142.     tkSetFogRamp(5, 3);
  143.     glClearIndex(128);
  144.     }
  145.  
  146.     Build_lists();
  147. }
  148.  
  149. static void Reshape(int width, int height)
  150. {
  151.  
  152.     glViewport(0, 0, (GLint)width, (GLint)height);
  153.  
  154.     glMatrixMode(GL_PROJECTION);
  155.     glLoadIdentity();
  156.     gluPerspective(45.0, 1.0, 1.0, 200.0);
  157.     glMatrixMode(GL_MODELVIEW);
  158. }
  159.  
  160. static GLenum Key(int key, GLenum mask)
  161. {
  162.  
  163.     switch (key) {
  164.       case TK_ESCAPE:
  165.     tkQuit();
  166.       case TK_UP:
  167.     rotX -= 5;
  168.     break;
  169.       case TK_DOWN:
  170.     rotX += 5;
  171.     break;
  172.       case TK_LEFT:
  173.     rotY -= 5;
  174.     break;
  175.       case TK_RIGHT:
  176.     rotY += 5;
  177.     break;
  178.       case TK_D:
  179.     fogDensity *= 1.10;
  180.     glFogf(GL_FOG_DENSITY, fogDensity);
  181.     break;
  182.       case TK_d:
  183.     fogDensity /= 1.10;
  184.     glFogf(GL_FOG_DENSITY, fogDensity);
  185.     break;
  186.       default:
  187.     return GL_FALSE;
  188.     }
  189.     return GL_TRUE;
  190. }
  191.  
  192. static void Draw(void)
  193. {
  194.  
  195.     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  196.  
  197.     glPushMatrix();
  198.  
  199.     glTranslatef(0, 0, zTranslate);
  200.     glRotatef(rotY, 0,1,0);
  201.     glRotatef(rotX, 1,0,0);
  202.     glScalef(1.0, 1.0, 10.0);
  203.  
  204.     glCallList(cubeList);
  205.  
  206.     glPopMatrix();
  207.  
  208.     glFlush();
  209.  
  210.     if (doubleBuffer) {
  211.     tkSwapBuffers();
  212.     }
  213. }
  214.  
  215. static GLenum Args(int argc, char **argv)
  216. {
  217.     GLint i;
  218.  
  219.     rgb = GL_TRUE;
  220.     doubleBuffer = GL_FALSE;
  221.     directRender = GL_TRUE;
  222.  
  223.     for (i = 1; i < argc; i++) {
  224.     if (strcmp(argv[i], "-ci") == 0) {
  225.         rgb = GL_FALSE;
  226.     } else if (strcmp(argv[i], "-rgb") == 0) {
  227.         rgb = GL_TRUE;
  228.     } else if (strcmp(argv[i], "-sb") == 0) {
  229.         doubleBuffer = GL_FALSE;
  230.     } else if (strcmp(argv[i], "-db") == 0) {
  231.         doubleBuffer = GL_TRUE;
  232.     } else if (strcmp(argv[i], "-dr") == 0) {
  233.         directRender = GL_TRUE;
  234.     } else if (strcmp(argv[i], "-ir") == 0) {
  235.         directRender = GL_FALSE;
  236.     } else {
  237.         printf("%s (Bad option).\n", argv[i]);
  238.         return GL_FALSE;
  239.     }
  240.     }
  241.     return GL_TRUE;
  242. }
  243.  
  244. void main(int argc, char **argv)
  245. {
  246.     GLenum type;
  247.  
  248.     if (Args(argc, argv) == GL_FALSE) {
  249.     tkQuit();
  250.     }
  251.  
  252.     tkInitPosition(0, 0, 300, 300);
  253.  
  254.     type = TK_DEPTH;
  255.     type |= (rgb) ? TK_RGB : TK_INDEX;
  256.     type |= (doubleBuffer) ? TK_DOUBLE : TK_SINGLE;
  257.     type |= (directRender) ? TK_DIRECT : TK_INDIRECT;
  258.     tkInitDisplayMode(type);
  259.  
  260.     if (tkInitWindow("Fog Test") == GL_FALSE) {
  261.     tkQuit();
  262.     }
  263.  
  264.     Init();
  265.  
  266.     tkExposeFunc(Reshape);
  267.     tkReshapeFunc(Reshape);
  268.     tkKeyDownFunc(Key);
  269.     tkDisplayFunc(Draw);
  270.     tkExec();
  271. }
  272.